<?php

/**
* @desc Шагаем по набору тестов.
* 
*/
class Tests_Frontend_Process extends Kernel_Action_Form
{
    
    /**
     * Флаг, указывающий, что после сохранения данных формы не нужно показывать
     * сответствующее сообщение.
     *
     * @var boolean
     */
    protected $_no_message = true;
    
    /**
     * Путь к файлу шаблона.
     *
     * @var string
     */
    protected $_template = 'tests/frontend/process.tpl';
    
    /**
     * Инициализирует элементы формы.
     *
     */
    protected function _initElements() 
    {
        //var_dump(Tests_Utils::getSesseion());
        // получаем долгожданную группу данных: вопрос => ответы
        $data = $this->_getData();
        
        Application::getResponse()->assign(array(
            'question' => array('id' => $data['question_id'])
            ));
        Application::getResponse()->setTitle(' : ' . $data['question_title']);
        
        // заьираем ответы
        $answers = array_combine(
            explode(Tests_Utils::$_separator, $data['answer_ids']), 
            explode(Tests_Utils::$_separator, $data['answer_titles'])
            );
        foreach($answers as $id => $title) {
            $this->_addElement('answer[' . $id . ']', array(
                'type' => 'checkbox', 
                'caption' => $title
                )); 
        }
    }
    
    /**
    * @desc Сохраняем данные.
    * 
    */
    protected function _save() 
    {
        $checked = isset($_POST['answer']) 
            ? array_keys($_POST['answer']) 
            : array();
        //var_dump($checked);
        $question = isset($_POST['question']) 
            ? (int)$_POST['question']
            : 0;
        if (!count($checked) || $question <= 0) return;
        
        $SESSION = Tests_Utils::getSesseion();
        
        // сохраняем в сессию
        Tests_Utils::setSessionStep($question);
                
        // сохраняем в БД
        $values = '';
        foreach ($checked as $answer) {
            $values .= '(' . $SESSION['user_id'] . ', ' . $SESSION['test_id'] . ', ' . $question . ', ' . $answer . '), ';
        }
        $values = substr($values, 0, -2);
        
        $query = '
            INSERT 
                   `user_answers` 
                   (`user_id`, `tests_group`, `question_id`, `answer_id`)
            VALUES 
                   ' . $values;
        database::query($query);
    }
    
    /**
    * @desc Возвращает набор ответ => вопросы
    * 
    * @return array
    */
    private function _getData() 
    {
        // устанавливаем идентификаторы до сих НЕотвеченных вопросов
        $question_ids = array_values(array_diff(
            array_keys($questions = Tests_Utils::getData()), 
            Tests_Utils::getSesseionData()
            ));
        
        // случайно выбираем id вопроса из массива вопросов уже выбранного случайным образом :)
        $random = $question_ids[rand(0, count($question_ids)-1)];
        return $questions[$random];
    }
    
}